package Modelo;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Vector;

public class LigadeBeisbol {
	public String nombre;
	public String Descripcion;
	private ArrayList<Equipo> equipos;
	private ArrayList<Partido> partidos;
	private ArrayList<Umpire> arbitros;
	Partido partido;
	Equipo equipo;
	int acumJJ = 0;
	int acumJG = 0;
	int acumJP = 0;
	float dif;

	public LigadeBeisbol() {
		super();

		arbitros = new ArrayList<Umpire>();
		partidos = new ArrayList<Partido>();
		equipos = new ArrayList<Equipo>();

	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getDescripcion() {
		return Descripcion;
	}

	public void setDescripcion(String descripcion) {
		Descripcion = descripcion;
	}

	public ArrayList<Equipo> getEquipos() {
		return equipos;
	}

	public void setEquipos(ArrayList<Equipo> equipos) {
		this.equipos = equipos;
	}

	public ArrayList<Partido> getPartidos() {
		return partidos;
	}

	public void setPartidos(ArrayList<Partido> partidos) {
		this.partidos = partidos;
	}

	public ArrayList<Umpire> getArbitros() {
		return arbitros;
	}

	public void setArbitros(ArrayList<Umpire> arbitros) {
		this.arbitros = arbitros;
	}

	public Equipo equipoPrimerLugar() {

		int mayor = 0;
		Equipo EquipoLider = new Equipo();
		for (int i = 0; i < equipos.size(); i++) {
			if (equipos.get(i).getJuegosG() > mayor) {
				mayor = equipos.get(i).getJuegosG();
				EquipoLider = equipos.get(i);

			}
			// return mayor1;

		}
		return EquipoLider;

	}

	public double generarTablaPos(Equipo x) {
		return ((equipoPrimerLugar().getJuegosG() - x.getJuegosG()) + (x
				.getJuegosP() - equipoPrimerLugar().getJuegosP())) / 2;
	}

	public void registrarUmpire(Umpire umpire) {
		this.arbitros.add(umpire);
	}

	public void registrarEquipo(Equipo equipo) {
		this.equipos.add(equipo);
	}

	public boolean equipoPar() {

		if (((equipos.size() % 2) == 0) && ((equipos.size() / 2) > 0)) {
			return true;
		} else {
			return false;
		}
	}

	public void GenerarPartido() {

		int[] part = new int[equipos.size()];

		for (int n = 0; n < equipos.size(); n++)
			part[n] = n;

		for (int r = 0; r < 4; r++)
			for (int i = 0; i < equipos.size() - 1; i++) {
				Cruzar(part, r);
				Reordenar(part);
			}

		generarFechas();
		asignarUmpire();

		System.out.println(equipos);

	}

	/*
	 * public ArrayList<Equipo> OrdenarPosiciones(){ boolean seordeno=false;
	 * ArrayList<Equipo> equipo = new ArrayList<Equipo> (equipos); Equipo
	 * equipo1= new Equipo(); do{ int aux=0; for(int i=0; i<equipo.size()-1;
	 * i++){
	 * 
	 * if(equipo.get(i).getJuegosG()>equipo.get(i+1).getJuegosG()){ //if(aux>0){
	 * equipo1=equipo.get(i); equipo.set(i, equipo.get(i+1)); equipo.set((i+1),
	 * equipo1); seordeno=true; } } } while(seordeno); return equipo; }
	 */
	public void asignarUmpire() {
		Umpire umpire = new Umpire();
		boolean valido = false;
		for (int m = 0; m < partidos.size(); m++) {
			while (!valido) {
				umpire = arbitros.get((int) Math.floor(Math.random()
						* arbitros.size()));
				valido = true;
				for (int i = 0; i < m % (equipos.size() / 2); i++) {
					if (umpire == partidos.get(m - i - 1).getUmpire())
						valido = false;
				}
			}
			partidos.get(m).setUmpire(umpire);

			// System.out.println("Umpire del partido" + " " +
			// umpire.getNombre());

		}
	}

	public void generarFechas() {
		long dia;
		Calendar c = Calendar.getInstance();
		for (int m = 0; m < partidos.size(); m++) {
			if (m % (equipos.size() / 2) == 0) {
				dia = c.getTimeInMillis() + (1000 * 60 * 60 * 24);
				c.setTimeInMillis(dia);
				// System.out.println(dia);
				if (c.get(Calendar.DAY_OF_WEEK) != 1) {
					dia = c.getTimeInMillis() + (1000 * 60 * 60 * 24);
					c.setTimeInMillis(dia);
				}
			}
			partidos.get(m).setFechaJuego(c.getTime());
		}
	}

	public void Cruzar(int[] arr, int r) {
		int indLocal = 0;
		int indVisitante = 0;
		for (int i = 0; i < equipos.size() / 2; i++) {
			if (r % 2 == 0) {
				indLocal = arr[i];
				indVisitante = arr[equipos.size() - 1 - i];
			} else {
				indLocal = arr[equipos.size() - 1 - i];
				indVisitante = arr[i];
			}
			System.out.print(indLocal + " ");
			System.out.println(indVisitante + " ");

			crearPartido(indLocal, indVisitante);

		}
	}

	public void Reordenar(int[] arr) {
		int aux1 = 0;
		int aux2 = arr[1];
		for (int i = 1; i < equipos.size() - 1; i++) {
			aux1 = arr[i + 1];
			arr[i + 1] = aux2;
			aux2 = aux1;
		}
		arr[1] = aux2;
		// System.out.println("Pase por aqui metodo reordenar");
	}

	private void asignarCarrerasJugadores(Partido partido) {
		for (int i = 0; i < partido.getCarreraLocal(); i++) {
			Equipo equipo = partido.getEquipoLoc();
			int cant = equipo.getJugadores().size();
			int indice = (int) Math.floor(Math.random() * cant);
			Jugador jugador = equipo.getJugadores().get(indice);
			partido.getJugadorimplocal().add(jugador);
		}
		for (int i = 0; i < partido.getCarreravis(); i++) {
			Equipo equipo = partido.getEquipoVis();
			int cant = equipo.getJugadores().size();
			int indice = (int) Math.floor(Math.random() * cant);
			Jugador jugador = equipo.getJugadores().get(indice);
			partido.getJugadorimpvis().add(jugador);
		}
		for (int i = 0; i < partido.getHrLocal(); i++) {
			Equipo equipo = partido.getEquipoLoc();
			int cant = equipo.getJugadores().size();
			int indice = (int) Math.floor(Math.random() * cant);
			Jugador jugador = equipo.getJugadores().get(indice);
			partido.getJugadorHRlocal().add(jugador);
		}
		for (int i = 0; i < partido.getHrVis(); i++) {
			Equipo equipo = partido.getEquipoVis();
			int cant = equipo.getJugadores().size();
			int indice = (int) Math.floor(Math.random() * cant);
			Jugador jugador = equipo.getJugadores().get(indice);
			partido.getJugadorHRvis().add(jugador);
		}
	}

	private void asignarCarreras(Partido partido) {
		int nroinnings = 9;
		int indicecarreraLocal = 0;
		int indicecarreravis = 0;
		int indicehrLocal = 0;
		int indicehrvis = 0;
		int extrainning1 = (int) Math.floor(Math.random() * 10);
		;
		if (extrainning1 < 5) {
			nroinnings = nroinnings + extrainning1;
		}

		do {
			indicecarreraLocal = (int) Math.floor(Math.random() * 16);
			indicecarreravis = (int) Math.floor(Math.random() * 16);
			indicehrLocal = (int) Math.floor(Math.random() * 2);
			indicehrvis = (int) Math.floor(Math.random() * 2);
			// Carreraequ1 = CARRERAS[indicecarreraLocal];
			// equipo.setCarrerasFavor(indicecarreraLocal);
			partido.setCarreraLocal(indicecarreraLocal - indicehrLocal);
			partido.setCarreravis(indicecarreravis - indicehrvis);
			partido.setHrLocal(indicehrLocal);
			partido.setHrVis(indicehrvis);

		} while (indicecarreraLocal == indicecarreravis);

		partido.getEquipoLoc().setJuegosJ(
				partido.getEquipoLoc().getJuegosJ() + 1);
		partido.getEquipoVis().setJuegosJ(
				partido.getEquipoVis().getJuegosJ() + 1);
		if (indicecarreraLocal > indicecarreravis) {
			partido.getEquipoLoc().setJuegosG(
					partido.getEquipoLoc().getJuegosG() + 1);
			partido.getEquipoVis().setJuegosP(
					partido.getEquipoVis().getJuegosP() + 1);
		} else {
			partido.getEquipoVis().setJuegosG(
					partido.getEquipoVis().getJuegosG() + 1);
			partido.getEquipoLoc().setJuegosP(
					partido.getEquipoLoc().getJuegosP() + 1);
		}
		partido.setNroinnings(nroinnings);

	}

	public void crearPartido(int indLocal, int indVisitante) {
		Partido partido = new Partido();
		partido.setEquipoLoc(equipos.get(indLocal));
		partido.setEquipoVis(equipos.get(indVisitante));
		asignarCarreras(partido);
		asignarCarrerasJugadores(partido);
		partidos.add(partido);

		equipoPrimerLugar();

	}
}
